package com.qys.livesMall.open.mail.core;

import com.qys.livesMall.open.mail.config.MailConfig;
import com.qys.livesMall.open.mail.factory.SessionFactory;
import com.qys.livesMall.open.mail.modal.MailFile;
import com.qys.livesMall.open.mail.modal.MailM;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;

import javax.activation.DataHandler;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;


@Slf4j
public class MailServer {
    // 1.创建Session
    static Session session = SessionFactory.createSession();

    static MailConfig mailConfig=MailConfig.get();

    public static void send(MailM m) throws Exception {



        // 2.创建邮件对象(Message抽象类的子类对象)
        MimeMessage msg = new MimeMessage(session); // 传入session
        handleUser(msg,m);

        msg.setSubject(m.getTitle(),"utf-8"); // 标题
        msg.setText(m.getMsg(),"utf-8"); // 正文

        // 3.发送
        Transport.send(msg);

    }


    public static void sendHtml(MailM m) throws Exception {


        // 2.创建邮件对象(Message抽象类的子类对象)
        MimeMessage msg = new MimeMessage(session); // 传入session
        handleUser(msg,m);
        msg.setSubject(m.getTitle(), "utf-8"); // 标题

        // 邮件正文中包含有“html”标签(控制文本的格式)
        msg.setText(m.getMsg(), "utf-8", "html"); // 正文

        // 3.发送
        Transport.send(msg);
    }

    public static void sendFile(MailM m) throws Exception {


        // 2.创建邮件对象(Message抽象类的子类对象)
        MimeMessage msg = new MimeMessage(session); // 传入session
        handleUser(msg, m);
        msg.setSubject(m.getTitle(), "utf-8"); // 标题

        // 3.邮件内容"复合"对象
        Multipart multipart = new MimeMultipart();

        // 正文
        BodyPart textPart = new MimeBodyPart();
        // 参数1：正文内容

        // 参数2：内容类型;字符编码集
        textPart.setContent(m.getMsg(), "text/html;charset=utf-8");
        // 添加至邮件内容
        multipart.addBodyPart(textPart); // 添加正文

        // 一个Multipart对象可以添加若干个BodyPart，
        // 其中第一个BodyPart是文本，即邮件正文，后面的BodtPart是附件。
        // BodyPart依靠setContent()决定添加的内容，
        // 如果添加文本，用setContent("...","text/plain;charset=utf-8")添加纯文本，
        // 或者用setContent("...","text/html;charset=utf-8")添加HTML文本。
        // 如果添加附件，需要设置文件名（不一定和真实文件名一致），
        // 并且添加一个DataHandler(),传入文件的MIME类型。
        // 二进制文件可以用application/octet-stream，
        // Word文档则是application/msword。最后通过setContent()把Multipart添加到Message中，即可发送。

        addFile(m, multipart);

        // 设置邮件内容
        msg.setContent(multipart);

        // 3.发送
        Transport.send(msg);
    }

    private static void handleUser(MimeMessage msg,MailM m) throws Exception {
        if (m==null){
            throw new MessagingException("发送对象错误");
        }
//        if (m.getFromUser()==null){
//            throw new MessagingException("发送人不存在");
//        }
        m.setFromUser(mailConfig.getSendUser());

        if (CollectionUtils.isEmpty(m.getToUsers())){
            throw new MessagingException("收件人人不存在");
        }
        // 发件人
        msg.setFrom(new InternetAddress(m.getFromUser()));
        // 收件人
        InternetAddress [] tos=new InternetAddress [m.getToUsers().size()];
        int toIndex=0;
        for(String to:m.getToUsers()){
            tos[toIndex]= new InternetAddress(to);
        }
        msg.setRecipients(Message.RecipientType.TO, tos);
        if (!CollectionUtils.isEmpty(m.getCCUsers())){
            // 抄送人
            InternetAddress [] ccs=new InternetAddress [m.getCCUsers().size()];
            int ccIndex=0;
            for(String cc:m.getToUsers()){
                ccs[ccIndex]= new InternetAddress(cc);
            }
            msg.setRecipients(Message.RecipientType.CC, ccs);
        }


    }

    private  static  byte[] fileToByte(File file) throws IOException {
        BufferedInputStream bis=null;
        byte[] fileBytes=null;
        try{
            bis=new BufferedInputStream(new FileInputStream(file));
            //指定字节数组的长度
            fileBytes=new byte[bis.available()];
            bis.read(fileBytes);

        }catch (Exception e){
            log.error("文件转换byte失败",e);
        }finally {
            if (bis!=null) {
                bis.close();
            }
        }
        return fileBytes;
    }

    private static void addFile(MailM m,Multipart multipart) throws MessagingException, IOException {
        if (CollectionUtils.isEmpty(m.getFiles())){
            return;
        }
        for(MailFile mailFile:m.getFiles()) {
            // 附件
            BodyPart bodyPart = new MimeBodyPart();
            bodyPart.setFileName(mailFile.getShowName()); // 设置附件文件的显示名称
            // 数据处理对象(读取附件文件从本地磁盘进行读取)
            bodyPart.setDataHandler(
                    new DataHandler(
                            new ByteArrayDataSource(
                                    fileToByte(mailFile.getFile()),
                                    "application/octet-stream")));
            if (mailFile.getCid()!=null) {
                bodyPart.setHeader("Content-ID", mailFile.getCid());
            }
            multipart.addBodyPart(bodyPart);

        }
    }
}
